home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / PowerD / powerd / examples / chunky / nfs.d next >
Encoding:
Text File  |  2002-10-28  |  10.2 KB  |  474 lines

  1. // this only a small example chunky lib and rtg library usage
  2. // it's a bit stupid, not a control yet
  3.  
  4. MODULE    'rtgmaster',
  5.             'rtgmaster/rtgmaster',
  6.             'rtgmaster/rtgc2p',
  7.             'rtgmaster/rtgsublibs',
  8.             'rtgmaster/rtgami'
  9. MODULE    'exec/memory',
  10.             'utility/tagitem',
  11.             'intuition/screens',
  12.             'intuition/intuition'
  13. MODULE    'lib/chunky'
  14.  
  15. DEF    nbuf=0,    // rendering buffer
  16.         c2psig,    // c2p signal
  17.  
  18.         width,    // buffer dimensions
  19.         height
  20.  
  21. //#define GET_TIME TRUE
  22.  
  23. OBJECT chunky
  24.     wi/he:LONG,
  25.     chunky:PTR TO UBYTE
  26.  
  27. PROC Go(rsc:PTR TO RtgScreenAMI,chunky:PTR TO chunky,track:PTR TO track)
  28.     DEF    n=0,imsg:PTR TO IntuiMessage,c:PTR TO camera
  29.     DEFD    micros,sum_micros
  30.     c:=[
  31.         -50.0,1.00,0.0,
  32.           0.0,0.00,0.0,
  33.           1.0,1.00,1.0,
  34.           0.0,0.00,0.0,
  35.           100.0]:camera
  36.     WHILE n<4096
  37.         IF imsg:=RtgGetMsg(rsc)
  38.             SELECT imsg.Class
  39.             CASE IDCMP_MOUSEBUTTONS
  40.             CASE IDCMP_RAWKEY
  41. /*
  42.                 SELECT imsg.Code AND $ff
  43.                 CASE $4f;    car.udir:=-1
  44.                 CASE $4e;    car.udir:=1
  45.                 CASE $4c;    car.uacc:=car.acceleration
  46.                 CASE $4d;    car.uacc:=-car.acceleration
  47.                 CASE $cc,$cd;    car.uacc:=0
  48.                 CASE $cf,$ce;    car.udir:=0
  49.                 CASE $40
  50.                 ENDSELECT
  51. */
  52.             ENDSELECT
  53.             RtgReplyMsg(rsc,imsg)
  54.         ENDIF
  55. //        MoveCar(car,track)
  56.         c.z+=2
  57. /*
  58. #ifdef GET_TIME
  59.         sum_micros:=0.0
  60.         polycount:=polydraw:=transcount:=0
  61.         ReadEClock(time0)
  62. #endif
  63. */
  64.         FillChunky(chunky,3)
  65.         RenderTrack(chunky,track,c)
  66. /*
  67. #ifdef GET_TIME
  68.         ReadEClock(time1)
  69.         micros:=(time1.Lo-time0.Lo)*micros_per_eclock
  70.         sum_micros+=micros
  71.         PrintF('\d[4]: \d[6] \d[6] \d[6] \d[9] µs\n',n,polycount,polydraw,transcount,micros)
  72. #endif
  73. */
  74.     EXITIF ChangeBuffer(rsc,chunky)=FALSE
  75.         n++
  76.     EXITIF Mouse()=2
  77.     ENDWHILE
  78. ENDPROC
  79.  
  80. PROC ChangeBuffer(rsc:PTR TO RtgScreen,chunky:PTR TO chunky)(LONG)
  81.     DEF    buf
  82.     IF buf:=GetBufAdr(rsc,nbuf)
  83.         CopyRtgBlit(rsc,buf,chunky.chunky,0,0,0,chunky.wi,chunky.he,chunky.wi,chunky.he,0,0)
  84.         RtgWaitTOF(rsc)
  85.         SwitchScreens(rsc,nbuf)
  86.         IF nbuf=2 THEN nbuf:=0
  87.     ELSE RETURN FALSE
  88. ENDPROC TRUE
  89.  
  90. DEF    RTGMasterBase
  91.  
  92. PROC main()
  93.     DEF    req:PTR TO ScreenReq,
  94.             rsc:PTR TO RtgScreen,
  95.             bin:PTR TO UBYTE,ok,
  96.             track:PTR TO track
  97.     DEF    tags:PTR TO TagItem
  98.  
  99.     // open the rtgmaster.library
  100.     IF RTGMasterBase:=OpenLibrary('rtgmaster.library',23)
  101.  
  102.         // open the rtg screen requester to select screenmode and dimensions
  103.         IF req:=RtgScreenModeReq([
  104.                 smr_MinWidth,320,
  105.                 smr_MinHeight,200,
  106.                 smr_MaxWidth,1024,
  107.                 smr_MaxHeight,768,
  108.                 smr_ChunkySupport,512,
  109.                 smr_PlanarSupport,-1,
  110.                 smr_Buffers,2,                                // double buffering
  111.                 smr_PrefsFileName,'simul.prefs',        // preferences file
  112.                 TAG_END])
  113.  
  114.             // open requested screen
  115.             IF rsc:=OpenRtgScreen(req,NIL)
  116.  
  117.                 GetRtgScreenData(rsc,tags:=[
  118.                     grd_Width,0,
  119.                     grd_Height,0,
  120.                     TAG_END])
  121.                 width:=tags[0].Data
  122.                 height:=tags[1].Data
  123.  
  124.                 IF RtgInitRDCMP(rsc)
  125.  
  126.                     // get c2p signal
  127.                     IF (c2psig:=AllocSignal(-1))<>-1
  128.  
  129.                         // lock the screen for private use
  130.                         LockRtgScreen(rsc)
  131.  
  132.                         // setup colours of the screen
  133.                         LoadPalette(rsc,'palette')
  134.  
  135.                         IF pool:=CreatePool(MEMF_PUBLIC|MEMF_CLEAR,16384,2048)
  136.                             IF ok,track:=LoadTrack(0)
  137.                                 IF bin:=AllocPooled(pool,width*height)
  138.  
  139.                                     IF get_timer()
  140.                                         Go(rsc,[width,height,bin]:chunky,track)
  141.                                         free_timer()
  142.                                     ENDIF
  143.  
  144.                                 ELSE PrintF('Not enough memory!\n')
  145.                                 UnLoadTrack(track)
  146.                             ENDIF
  147.                             DeletePool(pool)
  148.                         ELSE PrintF('Not enough memory!\n')
  149.  
  150.                         // unlock locked screen
  151.                         UnlockRtgScreen(rsc)
  152.  
  153.                         FreeSignal(c2psig)
  154.                     ELSE PrintF('Can''t get c2p signal!\n')
  155.                 ENDIF
  156.  
  157.                 CloseRtgScreen(rsc)
  158.             ELSE PrintF('Can''t open rtg screen!\n')
  159.  
  160.             FreeRtgScreenModeReq(req)
  161.         ELSE PrintF('Can''t open rtg requester!\n')
  162.  
  163.         CloseLibrary(RTGMasterBase)
  164.     ELSE PrintF('Can''t open rtgmaster.library v23+!\n')
  165. ENDPROC
  166.  
  167. PROC LoadPalette(rsc,name:PTR TO CHAR)
  168.     DEF rgb[800]:ULONG,f
  169.     IF f:=Open(name,OLDFILE)
  170.         Read(f,rgb,FileLength(name))
  171.         LoadRGBRtg(rsc,rgb)
  172.         Close(f)
  173.     ENDIF
  174. ENDPROC
  175.  
  176. DEF    pool
  177.  
  178. OBJECT track
  179.     line:PTR TO trackline,
  180.     count:WORD
  181.  
  182. OBJECT trackline
  183.     next/prev:PTR TO trackline,
  184.     data:PTR TO trackdata,
  185.     count:WORD
  186.  
  187. OBJECT trackdata
  188.     texture:WORD,            // TX...
  189.     x/y/z:FLOAT
  190.  
  191. ENUM    TX_End=0,
  192.         TX_Black=1,
  193.         TX_White=15,
  194.         TX_Yellow=88,
  195.         TX_Grass=58,
  196.         TX_Grass1=57,
  197.         TX_Grass2=56,
  198.         TX_Road=7
  199.  
  200. OBJECT kxy
  201.     kind:W,
  202.     x/y:F
  203.  
  204. OBJECT xyz
  205.     x/y/z:F
  206.  
  207. OBJECT xy
  208.     x/y:F
  209.  
  210. PROC LoadTrack(n)(BOOL,PTR TO track)
  211.     SELECT n
  212.     CASE 0
  213.         DEF    profile:PTR TO kxy,pos:PTR TO xyz
  214.         profile:=[    // profile definition
  215.             TX_Grass2,-10.0,  3,
  216.             TX_Grass1, -7.0,  1,
  217.             TX_Grass,  -4.0,  0,
  218.             TX_White,  -3.0,  0,
  219.             TX_Road,   -2.8,  0,
  220.             TX_Yellow, -0.1,  0,
  221.             TX_Road,    0.1,  0,
  222.             TX_White,   2.8,  0,
  223.             TX_Grass,   3.0,  0,
  224.             TX_Grass1,  4.0,  0,
  225.             TX_Grass2,  7.0,  1,
  226.             TX_End,    10.0,  3]:kxy        // 12 pieces
  227.         pos:=[        // profile positions
  228.             -50.0,0.0,-100.0,
  229.             -50.0,0.0, -90.0,
  230.             -50.0,0.0, -80.0,
  231.             -50.0,0.0, -70.0,
  232.             -50.0,0.0, -60.0,
  233.             -50.0,0.0, -50.0,
  234.             -50.0,0.0, -40.0,
  235.             -50.0,0.0, -30.0,
  236.             -50.0,0.0, -20.0,
  237.             -50.0,0.0, -10.0,        // 10
  238.  
  239.             -50.0,0.0,   0.0,
  240.             -50.0,0.0,  10.0,
  241.             -50.0,0.0,  20.0,
  242.             -50.0,0.0,  30.0,
  243.             -50.0,0.0,  40.0,
  244.             -50.0,0.0,  50.0,
  245.             -50.0,0.0,  60.0,
  246.             -50.0,0.0,  70.0,
  247.             -50.0,0.0,  80.0,
  248.             -50.0,0.0,  90.0,        // 20
  249.  
  250.             -50.0,0.0, 100.0,
  251.             -49.4,0.0, 107.8,
  252.             -47.6,0.0, 115.5,
  253.             -44.6,0.0, 122.7,
  254.             -40.5,0.0, 129.4,
  255.             -35.4,0.0, 135.4,
  256.             -29.4,0.0, 140.5,
  257.             -22.7,0.0, 144.6,
  258.             -15.5,0.0, 147.6,
  259.              -7.8,0.0, 149.4,        // 30
  260.  
  261.               0.0,0.0, 150.0,
  262.               7.8,0.0, 149.4,
  263.              15.5,0.0, 147.6,
  264.              22.7,0.0, 144.6,
  265.              29.4,0.0, 140.5,
  266.              35.4,0.0, 135.4,
  267.              40.5,0.0, 129.4,
  268.              44.6,0.0, 122.7,
  269.              47.6,0.0, 115.5,
  270.              49.4,0.0, 107.8,        // 40
  271.  
  272.              50.0,0.0, 100.0,
  273.              50.0,0.0,  90.0,
  274.              50.0,0.0,  80.0,
  275.              50.0,0.0,  70.0,
  276.              50.0,0.0,  60.0,
  277.              50.0,0.0,  50.0,
  278.              50.0,0.0,  40.0,
  279.              50.0,0.0,  30.0,
  280.              50.0,0.0,  20.0,
  281.              50.0,0.0,  10.0,        // 50
  282.  
  283.              50.0,0.0,   0.0,
  284.              50.0,0.0, -10.0,
  285.              50.0,0.0, -20.0,
  286.              50.0,0.0, -30.0,
  287.              50.0,0.0, -40.0,
  288.              50.0,0.0, -50.0,
  289.              50.0,0.0, -60.0,
  290.              50.0,0.0, -70.0,
  291.              50.0,0.0, -80.0,
  292.              50.0,0.0, -90.0,        // 60
  293.  
  294.              50.0,0.0,-100.0,
  295.              49.4,0.0,-107.8,
  296.              47.6,0.0,-115.5,
  297.              44.6,0.0,-122.7,
  298.              40.5,0.0,-129.4,
  299.              35.4,0.0,-135.4,
  300.              29.4,0.0,-140.5,
  301.              22.7,0.0,-144.6,
  302.              15.5,0.0,-147.6,
  303.               7.8,0.0,-149.4,        // 70
  304.  
  305.               0.0,0.0,-150.0,
  306.              -7.8,0.0,-149.4,
  307.             -15.5,0.0,-147.6,
  308.             -22.7,0.0,-144.6,
  309.             -29.4,0.0,-140.5,
  310.             -35.4,0.0,-135.4,
  311.             -40.5,0.0,-129.4,
  312.             -44.6,0.0,-122.7,
  313.             -47.6,0.0,-115.5,
  314.             -49.4,0.0,-107.8        // 80
  315.             ]:xyz
  316.  
  317.         DEF    track:PTR TO track,trackline:PTR TO trackline,trackdata:PTR TO trackdata,m
  318.         DEFF    prev=NIL:PTR TO trackline,cos,sin
  319.  
  320.         IFN track:=AllocPooled(pool,SIZEOF_track) THEN RETURN FALSE,NIL
  321.  
  322.         FOR n:=0 TO 79
  323.  
  324.             IFN trackline:=AllocPooled(pool,SIZEOF_trackline) THEN RETURN FALSE,NIL
  325.             IFN trackdata:=AllocPooled(pool,SIZEOF_trackdata*12) THEN RETURN FALSE,NIL
  326.  
  327.             IFN track.line THEN track.line:=trackline
  328.             IF prev THEN prev.next:=trackline
  329.  
  330.             cos:=pos[n].x/50.0
  331.             IF pos[n].z>100
  332.                 sin:=(pos[n].z-100)/50.0
  333.             ELSEIF pos[n].z<-100
  334.                 sin:=(pos[n].z+100)/50.0
  335.             ELSE sin:=0
  336.  
  337.             FOR m:=0 TO 11
  338.                 trackdata[m].texture:=profile[m].kind
  339.                 trackdata[m].x:=profile[m].x*cos+pos[n].x
  340.                 trackdata[m].y:=profile[m].y+pos[n].y
  341.                 trackdata[m].z:=profile[m].x*sin+pos[n].z
  342.             ENDFOR
  343.  
  344.             IF trackdata[5].texture=TX_Yellow AND Even(n) THEN trackdata[5].texture:=TX_Road
  345.  
  346.             trackline.data:=trackdata
  347.             trackline.prev:=prev
  348.             trackline.count:=12
  349.  
  350.             prev:=trackline
  351.         ENDFOR
  352.  
  353.         track.count:=80
  354.     ENDSELECT
  355. ENDPROC TRUE,track
  356.  
  357. PROC UnLoadTrack(tr:PTR TO track)
  358. ENDPROC
  359.  
  360. PROC RenderTrackTop(dst:PTR TO chunky,track:PTR TO track)
  361.     DEF    line=track.line:PTR TO trackline,data:PTR TO trackdata,n,next:PTR TO trackdata
  362.     WHILE line
  363.         data:=line.data
  364.         next:=IF line.next THEN line.next.data ELSE track.line.data
  365.         FOR n:=0 TO line.count-2
  366.             DrawTriangle(dst,[data[n].z+160,data[n].x+100,data[n+1].z+160,data[n+1].x+100,next[n].z+160,next[n].x+100]:xy,data[n].texture)
  367. //            DrawTriangle(dst,[data[n+1].z+160,data[n+1].x+100,next[n+1].z+160,next[n+1].x+100,next[n].z+160,next[n].x+100]:xy,data[n].texture)
  368.         ENDFOR
  369. //        PrintF('Yeah (\d)\b',data[n].texture)
  370.         line:=.next
  371.     ENDWHILE
  372. ENDPROC
  373.  
  374. OBJECT camera
  375.     x/y/z:FLOAT,        // camera position
  376.     ax/ay/az:FLOAT,    // camera angle
  377.     cx/cy/cz:FLOAT,    // camera angle cosine
  378.     sx/sy/sz:FLOAT,    // camera angle sine
  379.     l:FLOAT                // camera length
  380.  
  381. PROC RenderTrack(dst:PTR TO chunky,track:PTR TO track,c:PTR TO camera)
  382.     DEF    line=track.line:PTR TO trackline,data:PTR TO trackdata,n,next:PTR TO trackdata
  383.     DEF    x0,y0,x1,y1,x2,y2,q=0,sh,isok:BOOL,totok:BOOL
  384.     WHILE line
  385.         data:=line.data
  386.         next:=IF line.next THEN line.next.data ELSE track.line.data
  387.         FOR n:=0 TO line.count-2
  388.             totok:=FALSE
  389.             x0,y0,isok:=ComputePersp(data[n].x,data[n].y,data[n].z,c);            totok|=isok
  390.             x1,y1,isok:=ComputePersp(data[n+1].x,data[n+1].y,data[n+1].z,c);    totok|=isok
  391.             x2,y2,isok:=ComputePersp(next[n].x,next[n].y,next[n].z,c);            totok|=isok
  392.  
  393.             polycount++
  394.             IF totok=FALSE
  395.                 x0+=dst.wi>>1
  396.                 y0+=dst.he>>1
  397.                 x1+=dst.wi>>1
  398.                 y1+=dst.he>>1
  399.                 x2+=dst.wi>>1
  400.                 y2+=dst.he>>1
  401.  
  402.                 sh:=(c.z-data[n].z)/10-8
  403.                 IF sh<-5 THEN sh:=data[n].texture-6 ELSE sh:=data[n].texture+sh-1
  404.  
  405.                 DrawTriangle(dst,[x0,y0,x1,y1,x2,y2]:xy,sh)
  406.                 polydraw++
  407.  
  408.                 x0,y0,isok:=ComputePersp(next[n+1].x,next[n+1].y,next[n+1].z,c);    totok|=isok
  409.                 polycount++
  410.                 IFN totok
  411.                     x0+=dst.wi>>1
  412.                     y0+=dst.he>>1
  413.                     DrawTriangle(dst,[x0,y0,x1,y1,x2,y2]:xy,sh)
  414.                     polydraw++
  415.                 ENDIF
  416.             ENDIF
  417.  
  418.             IF Mouse()=2 THEN RETURN
  419.         ENDFOR
  420.         line:=.next
  421.         q++
  422.     EXITIF q>30
  423.     ENDWHILE
  424. ENDPROC
  425.  
  426. PROC ComputePersp(x:F,y:F,z:F,c:PTR TO camera)(F,F,BOOL)
  427.     DEFF    x1,y1,z1,xx,yy,zz,l
  428.  
  429.     x:=c.x-x
  430.     y:=c.y-y
  431.     z:=c.z-z
  432.  
  433.     x1:=x*c.cz+y*c.sz
  434.     y1:=y*c.cz-x*c.sz
  435.     xx:=x1*c.cy+z*c.sy
  436.     z1:=z*c.cy-x1*c.sy
  437.     zz:=z1*c.cx+y1*c.sx
  438.     yy:=y1*c.cx-z1*c.sx
  439.  
  440.     l:=c.l-zz
  441.     IF l>0.0
  442.         x:=xx*c.l/l
  443.         y:=yy*c.l/l
  444.     ELSE
  445.         RETURN 0,0,TRUE
  446.     ENDIF
  447.     transcount++
  448. ENDPROC x*10,y*10,FALSE
  449.  
  450. MODULE    'devices/timer','timer'
  451.  
  452. DEF    TimerBase
  453. DEF    timerio:TimeRequest,
  454.         time0:EClockVal,
  455.         time1:EClockVal,
  456.         micros_per_eclock:DOUBLE,
  457.         timerclosed,
  458.         polycount,
  459.         polydraw,
  460.         transcount
  461.  
  462. PROC get_timer()(L)
  463.     DEFL    ok=0
  464.     IFN timerclosed:=OpenDevice('timer.device',UNIT_VBLANK,timerio,0)
  465.         TimerBase:=timerio.IO.Device
  466.         micros_per_eclock:=1000000.0/ReadEClock(time0)
  467.         ok:=1
  468.     ENDIF
  469. ENDPROC ok
  470.  
  471. PROC free_timer()
  472.     IFN timerclosed THEN CloseDevice(timerio)
  473. ENDPROC
  474.